package tests;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import model.*;

/**
 * Prueba los distintos estados por los que pasa el fantasma.
 * Prueba las vivacidades de los fantasmas.
 * Prueba las velocidades de los fantasmas según el estado.
 * @author Juan Marchese (juan.marchese@fdvsolutions.com)
 *         Date: 2/06/12
 *         Time: 1:41
 */
public class FantasmaTest extends TestCase {

	/**
     * Prueba los estados por los que pasa el fantasma cuando está muerto.
     */
    public void testMuerto() {
        Fantasma fantasmaMuerto = new Fantasma(new Muerto());

        //Que no pueda incrementar su ira
        assertEquals("testMuerto",false,fantasmaMuerto.molestar());

        //Que no pueda moverse
        assertEquals("testMuerto",false,fantasmaMuerto.mover(null));

        //Que no pueda ser comido
        assertEquals("testMuerto",false,fantasmaMuerto.morir());

        //Que no pueda convertirse en presa
        assertEquals("testMuerto",false,fantasmaMuerto.convertirEnPresa());

        //Que al revivir lo haga en cazador normal
        assertEquals("testMuerto",true,fantasmaMuerto.reiniciarEstado());
        assertEquals("testMuerto",Constantes.CAZADORNORMAL,fantasmaMuerto.mostrarEstado());

    }

    /**
     * Prueba los estados por los que pasa el fantasma cuando es presa.
     */
    public void testPresa() {
        Fantasma fantasmaPresa = new Fantasma(new Presa());

        //Que no pueda incrementar su ira
        assertEquals("testPresa",false,fantasmaPresa.molestar());

        //Que no pueda convertirse en presa
        assertEquals("testPresa",false,fantasmaPresa.convertirEnPresa());

        //Que pueda moverse para escapar
        assertEquals("testPresa",true,fantasmaPresa.mover(null));

        //Que pueda ser comido y que pase a estado Muerto
        assertEquals("testPresa",true,fantasmaPresa.morir());
        assertEquals("testPresa",Constantes.MUERTO,fantasmaPresa.mostrarEstado());

        fantasmaPresa = new Fantasma(new Presa());

        //Que pasado el tiempo vuelva a ser cazador normal
        assertEquals("testPresa",true,fantasmaPresa.reiniciarEstado());
        assertEquals("testPresa",Constantes.CAZADORNORMAL,fantasmaPresa.mostrarEstado());

    }

    /**
     * Prueba los estados por los que pasa el fantasma cazador normal.
     */
    public void testCazadorNormal() {
        Fantasma fantasmaCazadorNormal = new Fantasma(new CazadorNormal());

        //Que no pueda volver a la normalidad sin pasar el ciclo
        assertEquals("testCazadorNormal",false,fantasmaCazadorNormal.reiniciarEstado());

        //Que no pueda ser comido
        assertEquals("testCazadorNormal",false,fantasmaCazadorNormal.morir());

        //Que pueda moverse
        assertEquals("testCazadorNormal",true,fantasmaCazadorNormal.mover(null));

        //Que se mueva con velocidad Normal
        assertEquals("testCazadorNormal",Constantes.CAZADORNORMAL,fantasmaCazadorNormal.mostrarEstado());

        //Que pueda convertirse en presa
        assertEquals("testCazadorNormal",true,fantasmaCazadorNormal.convertirEnPresa());
        assertEquals("testCazadorNormal",Constantes.PRESA,fantasmaCazadorNormal.mostrarEstado());

        fantasmaCazadorNormal = new Fantasma(new CazadorNormal());
        fantasmaCazadorNormal.setVivacidad(new Buscador());
        //Que pueda incrementar su ira
        assertEquals("testCazadorNormal",true,fantasmaCazadorNormal.molestar());
        assertEquals("testCazadorNormal",Constantes.CAZADORMOLESTO,fantasmaCazadorNormal.mostrarEstado());

    }

    /**
     * Prueba los estados por los que pasa el fantasma cazador molesto.
     */
    public void testCazadorMolesto() {
        Fantasma fantasmaCazadorMolesto = new Fantasma(new CazadorMolesto());

        //Que no pueda volver a la normalidad sin pasar el ciclo
        assertEquals("testCazadorMolesto",false,fantasmaCazadorMolesto.reiniciarEstado());

        //Que no pueda ser comido
        assertEquals("testCazadorMolesto",false,fantasmaCazadorMolesto.morir());

        //Que pueda moverse
        assertEquals("testCazadorMolesto",true,fantasmaCazadorMolesto.mover(null));

        //Que se mueva con velocidad Molesto
        assertEquals("testCazadorMolesto",Constantes.CAZADORMOLESTO,fantasmaCazadorMolesto.mostrarEstado());

        //Que pueda convertirse en presa
        assertEquals("testCazadorMolesto",true,fantasmaCazadorMolesto.convertirEnPresa());
        assertEquals("testCazadorMolesto",Constantes.PRESA,fantasmaCazadorMolesto.mostrarEstado());

        fantasmaCazadorMolesto = new Fantasma(new CazadorMolesto());
        fantasmaCazadorMolesto.setVivacidad(new Perezozo());        
        //Que pueda incrementar su ira
        assertEquals(fantasmaCazadorMolesto.molestar(),true);
        assertEquals("testCazadorMolesto",Constantes.CAZADORFURIOSO,fantasmaCazadorMolesto.mostrarEstado());

    }

    /**
     * Prueba los estados por los que pasa el fantasma cazador furioso.
     */
    public void testCazadorFurioso() {
        Fantasma fantasmaCazadorFurioso = new Fantasma(new CazadorFurioso());

        //Que no pueda volver a la normalidad sin pasar el ciclo
        assertEquals("testCazadorFurioso",false,fantasmaCazadorFurioso.reiniciarEstado());

        //Que no pueda ser comido
        assertEquals("testCazadorFurioso",false,fantasmaCazadorFurioso.morir());

        //Que pueda moverse
        assertEquals("testCazadorFurioso",true,fantasmaCazadorFurioso.mover(null));

        //Que se mueva con velocidad Furioso
        assertEquals("testCazadorFurioso",Constantes.CAZADORFURIOSO,fantasmaCazadorFurioso.mostrarEstado());

        //Que pueda convertirse en presa
        assertEquals("testCazadorFurioso",true,fantasmaCazadorFurioso.convertirEnPresa());
        assertEquals("testCazadorFurioso",Constantes.PRESA,fantasmaCazadorFurioso.mostrarEstado());

        fantasmaCazadorFurioso = new Fantasma(new CazadorFurioso());
        fantasmaCazadorFurioso.setVivacidad(new BuscadorTemperamental());        
        //Que pueda incrementar su ira volviendo a la original
        assertEquals("testCazadorFurioso",true,fantasmaCazadorFurioso.molestar());
        assertEquals("testCazadorFurioso",Constantes.CAZADORNORMAL,fantasmaCazadorFurioso.mostrarEstado());

    }

    /**
     * Prueba las vivacidades de los fantasmas.
     */
    public void testFantasmasVivacidades(){
    	Fantasma fantasmaBuscadorZonzo = new Fantasma(new Camino(1,1),new Zonzo());
    	Fantasma fantasmaBuscadorPerezoso = new Fantasma(new Camino(1,1),new Perezozo());
    	Fantasma fantasmaBuscador = new Fantasma(new Camino(1,1),new Buscador());
    	Fantasma fantasmaBuscadorTemperamental = new Fantasma(new Camino(1,1),new BuscadorTemperamental());
    	
    	assertEquals("testFantasmasVivacidades",Constantes.RADIOZONZO,fantasmaBuscadorZonzo.getCasillerosParaPersecucion());
    	assertEquals("testFantasmasVivacidades",Constantes.RADIOPEREZOZO,fantasmaBuscadorPerezoso.getCasillerosParaPersecucion());
    	assertEquals("testFantasmasVivacidades",Constantes.RADIOBUSCADOR,fantasmaBuscador.getCasillerosParaPersecucion());
    	assertEquals("testFantasmasVivacidades",Constantes.RADIOBUSCADORT,fantasmaBuscadorTemperamental.getCasillerosParaPersecucion());
    	
    }
    
    /**
     * Prueba las velocidades de los fantasmas de acuerdo a el estado.
     */
    public void testFantasmasVelocidadesSegunEstado(){
    	Fantasma fantasmaCazadorNormal = new Fantasma(new CazadorNormal());
    	Fantasma fantasmaCazadorMolesto = new Fantasma(new CazadorMolesto());
    	Fantasma fantasmaCazadorFurioso = new Fantasma(new CazadorFurioso());
    	Fantasma fantasmaPresa = new Fantasma(new Presa());
    	Fantasma fantasmaMuerto = new Fantasma(new Presa());
    	fantasmaMuerto.morir();
    	    	
    	assertEquals("testFantasmasVelocidadesSegunEstado",Constantes.VELOCIDAD_CAZADORNORMAL,fantasmaCazadorNormal.getVelocidad());
    	assertEquals("testFantasmasVelocidadesSegunEstado",Constantes.VELOCIDAD_CAZADORMOLESTO,fantasmaCazadorMolesto.getVelocidad());
    	assertEquals("testFantasmasVelocidadesSegunEstado",Constantes.VELOCIDAD_CAZADORFURIOSO,fantasmaCazadorFurioso.getVelocidad());
    	assertEquals("testFantasmasVelocidadesSegunEstado",Constantes.VELOCIDAD_PRESA,fantasmaPresa.getVelocidad());
    	assertEquals("testFantasmasVelocidadesSegunEstado",Constantes.VELOCIDAD_MUERTO,fantasmaMuerto.getVelocidad());
    }


    public static Test suite() {
        return new TestSuite(FantasmaTest.class);
    } // suite

    public static void main(String[] args) {
        junit.textui.TestRunner.run(suite());
    } // main
}
